package nespresso.beans;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import nespresso.beans.*;

public class Commande {
	private String id;
	private String date;
	private String statut;
	private String userresp;
	private float montant;
	private float port;
	
	private Ligne ligne;
	
	private Log log;
	
	// On récupère l'id de la commande, on va chercher le reste dans la base de données
	public Commande(String v1) {
		Ligne pl; //ligne précédente
		String nl = new String();
		log = LogFactory.getLog(Commande.class);
		id       = v1;
		Base bc = new Base();
		Mydate d = new Mydate();
		bc.GetResultat("commandes", "id" , id);
		bc.Suivant();
		date     = d.My2Date(bc.GetTexte("DATE"));
		statut   = bc.GetTexte("STATUT");
		userresp = bc.GetTexte("ID_USER_RESP");
		montant  = bc.GetReel("MONTANT");
		port     = bc.GetReel("PORT");
		bc.Free();
		log.info("Objet commande : ID = "+id+" | DATE = "+date+" | USER : "+userresp+" | MONTANT = "+montant);
		
		// Chargement des lignes
		Base bl = new Base();
		bl.GetResultat("lignescde", "id_commande", id);
		pl = null;
		while(bl.Suivant()) {
			Ligne lc = new Ligne(bl.GetTexte("ID"), bl.GetTexte("ID_CAPSULE"), bl.GetTexte("ID_USER"), bl.GetEntier("NOMBRE"), bl.GetReel("MONTANT"), id);
			if(pl != null) pl.SetSuivante(lc); //Chaînage entre la ligne précédente et la ligne en cours qui devient la suivante de la précédente (Aspirine svp...)
			if(ligne == null) ligne = lc; //Si première ligne
			lc.SetSuivante(null);
			pl = lc; // On sauve lc car elle sera la précédente de la prochaine (une 2ème aspirine svp...)
			log.info("Ligne " + lc.id + " lue et chargée");
		}
		bl.Free();
	}
	
	// Il s'agit d'une nouvelle commande
	public Commande() {
		
	}
	
	public String GetId() {
		return this.id;
	}
	
	public void SetId(String id) {
		this.id = id;
	}
	
	public String GetDate() {
		return this.date;
	}
	
	public void SetDate(String date) {
		this.date = date;
	}

	public String GetStatut() {
		return this.statut;
	}
	
	public void SetStatut(String statut) {
		this.statut = statut;
	}
	
	public String GetUserresp() {
		return this.userresp;
	}
	
	public void SetUserresp(String userresp) {
		this.userresp = userresp;
	}
	
	public float GetMontant() {
		return this.montant;
	}
	
	public void SetMontant(float montant) {
		this.montant = montant;
	}

	public float GetPort() {
		return this.port;
	}
	
	public void SetPort(float port) {
		this.port = port;
	}
	
	public Ligne GetLigne1() {
		return this.ligne;
	}
	
	public void SetLigne1(Ligne ligne) {
		this.ligne = ligne;
	}
	
	public Ligne GetLigne(String l) { // On recherche la ligne N° l dans la liste des lignes de la commande
		Ligne lignel = this.ligne;
		while((!lignel.GetId().equals(l)) && lignel != null ) lignel = lignel.GetSuivante();
		return lignel;
	}
	
	public String GetStatutSuivant() {
		String s = new String();
		
		s = this.GetStatut();
		if(s.equals("EN PAIEMENT"))    s = "CLOSE";
		if(s.equals("LIVRÉE"))         s = "EN PAIEMENT";
		if(s.equals("EN COMMANDE"))    s = "LIVRÉE";
		if(s.equals("EN PREPARATION")) s = "EN COMMANDE";

		
		return s;
	}
	
	public String GetNomprenom() { // Retourne le prénom et nom du user responsable de la commande
		String nomprenom;
		Base u = new Base();
		u.GetResultat("users", "id", this.userresp); u.Suivant();
		nomprenom = u.GetTexte("PRENOM") + " " + u.GetTexte("NOM");
		u.Free();
		return nomprenom;
	}
	
	public void AddLignenew(Ligne l) { //Nouvelle ligne d'une nouvelle commande
		Ligne ltmp = this.ligne;
		if(ltmp != null) {
			while(ltmp.GetSuivante() != null) {
				ltmp = ltmp.GetSuivante();
			}
			ltmp.SetSuivante(l);
		} else this.SetLigne1(l);
		l.SetSuivante(null);
	}
	
	public void AddLigne(Ligne l) { // Nouvelle ligne d'une commande existante
		Base bl = new Base();
		bl.InsertLigne(l);
		bl.Free();

		Ligne ltmp = this.ligne;
		if(ltmp != null) {
			while(ltmp.GetSuivante() != null) {
				ltmp = ltmp.GetSuivante();
			}
			ltmp.SetSuivante(l);
		} else this.SetLigne1(l);
		l.SetSuivante(null);
	}	
	
	public boolean AddCommande() {
		Base b = new Base();
		boolean ok = b.InsertCommande(this);
		b.Free();
		return ok; 
	}
	
	public void UpdateCommande() {
		Base bc = new Base();
		bc.UpdateCommande(this);
		bc.Free();
	}
	
	public void finalize() {
		log.info("Suppression de l'objet commande " + this.GetId() + " et des lignes correspondantes");
		// On supprime l'objet, mais il faut supprimer tout le chainage des lignes
		Ligne l = this.GetLigne1();
		Ligne s;
		while(l.GetSuivante() != null) {
			s = l.GetSuivante();
			l = null;
		}
		System.gc();
	}
	
}
